// 引入crypto-js库（需先安装：npm install crypto-js）
import CryptoJS from 'crypto-js';

// 加密密钥（重要：生产环境建议通过后端接口动态获取，而非硬编码）
// 密钥长度需与后端一致（AES-256需要32字节密钥）
const SECRET_KEY = process.env.VUE_APP_CRYPTO_SECRET || 'dougongshe123456';

// 初始化向量（IV），需与后端保持完全一致（16字节）
const IV = CryptoJS.enc.Utf8.parse('InitVector16Byte');

/**
 * AES-CBC加密（与后端算法匹配）
 * @param {string|object} data - 待加密的数据（字符串或对象）
 * @returns {string} 加密后的Base64字符串
 */
export function encrypt(data) {
  // 如果是对象，先转为JSON字符串
  if (typeof data === 'object') {
    data = JSON.stringify(data);
  }
  // 转为UTF8编码
  const dataUtf8 = CryptoJS.enc.Utf8.parse(data);
  // 密钥转为UTF8编码
  const keyUtf8 = CryptoJS.enc.Utf8.parse(SECRET_KEY);
  // 执行加密
  const encrypted = CryptoJS.AES.encrypt(dataUtf8, keyUtf8, {
    iv: IV,
    mode: CryptoJS.mode.CBC, // 加密模式与后端一致
    padding: CryptoJS.pad.Pkcs7 // 填充方式与后端一致
  });
  // 返回Base64格式加密结果
  return encrypted.toString();
}

/**
 * 加密对象中所有敏感字段（按需加密，避免冗余）
 * @param {object} obj - 待加密的对象（如存储配置）
 * @param {string[]} fields - 需要加密的字段列表（如['accessKey', 'secretKey']）
 * @returns {object} 加密后的对象
 */
export function encryptObject(obj, fields) {
  const encryptedObj = { ...obj };
  fields.forEach(field => {
    if (encryptedObj[field] !== undefined && encryptedObj[field] !== '') {
      encryptedObj[field] = encrypt(encryptedObj[field]);
    }
  });
  return encryptedObj;
}
